# 文件读写

# 读文件
# 要以读文件的模式打开一个文件对象，使用Python内置的open()函数，传入文件名和标示符

f = open('f://python.txt', 'r')    # 标示符'r'表示读，这样，我们就成功地打开了一个文件
print(f.read())     # 调用read()方法可以一次读取文件的全部内容，Python把内容读到内存，用一个str对象表示
f.close()   # 文件使用完毕后必须关闭，因为文件对象会占用操作系统的资源，并且操作系统同一时间能打开的文件数量也是有限的
print('-----------------------------------')
# 由于文件读写时都有可能产生IOError，一旦出错，后面的f.close()就不会调用。
# 所以，为了保证无论是否出错都能正确地关闭文件，我们可以使用try ... finally来实现

try:
    g = open('f://python.txt', 'r')
    print(g.read())
finally:
    if g:
        g.close()

print('-----------------------------------')
# 但是每次都这么写实在太繁琐，所以，Python引入了with语句来自动帮我们调用close()方法
with open('f://python.txt', 'r') as  r:
    print(r.read())
print('-----------------------------------')
# 调用read()会一次性读取文件的全部内容，如果文件有10G，内存就爆了，所以，要保险起见，可以反复调用read(size)方法，
# 每次最多读取size个字节的内容。另外，调用readline()可以每次读取一行内容，调用readlines()一次读取所有内容并按行返回list。因此，要根据需要决定怎么调用。
t = open('f://python.txt', 'r')
for line in t.readlines():
    print(line.strip())     # # 把末尾的'\n'删掉
t.close()
print('-----------------------------------')


# 二进制文件
# 前面讲的默认都是读取文本文件，并且是UTF-8编码的文本文件。要读取二进制文件，比如图片、视频等等，用'rb'模式打开文件即可
image = open('f://image/a.jpg', 'rb')
print(image.read())
image.close()

# 字符编码

# 要读取非UTF-8编码的文本文件，需要给open()函数传入encoding参数，例如，读取GBK编码的文件
gbk = open('f://gbk.txt', 'r', encoding='gbk')
print(gbk.read())
gbk.close()